<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <meta http-equiv="X-UA-Compatible" content="ie=edge" />
    <title>Document</title>
</head>

<body>
    <pre>

    ★★★★★

    1. let声明的变量不存在预解析,必须先声明，在使用
    2. let声明的变量在块级作用域有效，在块级作用域外部访问不到
    3. 同一个作用域内，let不可以声明重名的变量，在代码块内部，不可以在声明变量之前使用


    暂时性死区
    在代码块内，使用let、const命令声明变量之前，该变量都是不可用的。
  
    使用let关键字声明的变量才具有块级作用域，使用var声明的变量不具备块级作用域特性

  </pre
    >

    <script>
      // let 声明的是变量

      // var 声明的变量存在预解析，let 不存在
      // var 如果声明的变量如果声明多次，会存在覆盖，let 在同一个作用域中不允许声明同名的变量
      // var 在块级作用域中声明的变量，外部可以访问到，let 声明的，外部访问不到

      // console.log(aaa);// undefined
      // console.log(bbb);// 报错
      // var aaa = 111;
      // let bbb = 222;
      // console.log(aaa);// 111
      // console.log(bbb);// 222

      // var aaa = 333;
      // console.log(aaa);
      // let bbb = 444;
      // console.log(bbb); // 报错

      // {
      //   var cat = "Tom";
      //   let mouse = "jerry";
      // }
      // console.log(cat); // Tom
      // console.log(mouse); // 报错

      // 暂时性死区
      // 在代码块内，使用let命令声明变量之前，该变量都是不可用的。
      // var age = 19;
      // if (1 == 1) {
      //   console.log(age); // 报错
      //   let age = 18;
      // }

      console.log(a);
      // let a = 10;

      let a = 10;
      let b = 9;
      console.log(a);
    </script>
  </body>
</html>